In .NET 4 you don’t need the ToArray() call – string.Join is overloaded to accept IEnumerable<T> or just IEnumerable<string>.
There are potentially more efficient ways of doing it before .NET 4, but do you really need them? Is this actually a bottleneck in your code?
You could iterate over the list, work out the final size, allocate a StringBuilder of exactly the right size, then do the join yourself. That would avoid the extra array being built for little reason – but it wouldn’t save much time and it would be a lot more code.