There’s an inherent problem in doing so, because IEnumerator<T> has both MoveNext() and Current. You really want a single call such as:
bool TryMoveNext(out T value)
at that point you can atomically move to the next element and get a value. Implementing that and still being able to use yield could be tricky… I’ll have a think about it though. I think you’d need to wrap the “non-threadsafe” iterator in a thread-safe one which atomically performed MoveNext() and Current to implement the interface shown above. I don’t know how you’d then wrap this interface back into IEnumerator<T> so that you could use it in foreach though…
If you’re using .NET 4.0, Parallel Extensions may be able to help you – you’d need to explain more about what you’re trying to do though.
This is an interesting topic – I may have to blog about it…
EDIT: I’ve now blogged about it with two approaches.