The best practice is to use a Table-Valued Parameter assuming you're using a newer SQL version (2016+, maybe earlier). You then pass the table as a parameter to the sproc.
To pass such parameters in ADO.NET you should refer to this doc.
If for some reason that isn't available then strings are the easiest for simple data points but for more complex use XML if you need to pick the data apart using XPath. If you're running SQL 2016+ which has formal support for JSON then JSON might be smaller and faster. But at that point a TVP is probably the better choice anyway.