Dieser Beitrag ist jetzt viele Jahre alt, aber ich habe das gleiche Problem und habe eine Lösung. Wenn Sie keine DataTable verwenden, sondern stattdessen eine Sammlung von SqlDataRecord füllen, können Sie den Datentyp des SqlDataRecord auf SqlDbType.Variant setzen.
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;