Это зависит от того, что вы подразумеваете под «лучшим». Наименее интенсивное использование памяти - сначала рассчитать размер окончательной строки, затем создать StringBuilder с такой емкостью и добавить в него строки.
StringBuilder создаст строковый буфер с правильным размером, и этот буфер - то, что вы получаете из метода ToString как строку. Это означает, что дополнительные промежуточные строки или массивы не создаются.
// specify the separator
string separator = ", ";
// calculate the final length
int len = separator.Length * (list.Count - 1);
foreach (string s in list) len += s.Length;
// put the strings in a StringBuilder
StringBuilder builder = new StringBuilder(len);
builder.Append(list[0]);
for (int i = 1; i < list.Count; i++) {
builder.Append(separator).Append(list[i]);
}
// get the internal buffer as a string
string result = builder.ToString();