If you're just reading, you're fine. Each iterator will be independent of the others.
If you've ever wondered why the IEnumerable<T> interface doesn't directly have MoveNext() and Current, but instead has to create an IEnumerator<T> instance, that's why - the list itself doesn't keep the "cursor" saying where the iterator is, it's in the IEnumerator<T>. Sharing the IEnumerator<T> values between threads would almost certainly be a bad idea - but you're very unlikely to do that accidentally. The natural way of iterating on several threads will have one IEnumerator<T> per thread, which is safe (so long as you don't modify the list).