Ce message date de plusieurs années maintenant, mais j'ai rencontré le même problème et j'ai une solution. Si vous n'utilisez pas un DataTable mais remplissez plutôt une collection de SqlDataRecord, vous pouvez définir le type de données du SqlDataRecord sur SqlDbType.Variant.
List<SqlDataRecord> dataTable = new List<SqlDataRecord>();
var dr = new SqlDataRecord(
new SqlMetaData("Id", SqlDbType.Int),
new SqlMetaData("Value", SqlDbType.Variant));
dr.SetInt32(0, id);
dr.SetValue(1, myObject);
dataTable.Add(dr);
[...]
SqlCommand sqlCommand = new SqlCommand("dbo.MyProc");
var structuredParam = sqlCommand.Parameters.Add("myTableParam", SqlDbType.Structured);
structuredParam.Value = dataTable;