I'm repeatedly stumbling into design situations where a collection is unnecessarily mutable. It is possible to wrap a collection in an immutable wrapper but that's not a very satisfying solution, frankly, it's ugly. I have to worry about what a client could do with a collection if I exposed it. I don't want to copy it because it costs performance, I also don't want to cast it to IEnumerable because a client could still type-check, downcast to List<T> and mess it up. It's of course possible to create a state machine via the iterator mechanism but that seems superfluous just to provide safe shared access to a piece of data.
Please consider providing a well-factored high-performance immutable collections library to System.Collections[.Invariant]; with both interfaces and classes.
Not everything needs to be immutable but in many cases immutable collections is all you need and it provides both thread-safety (hello shared im-mutable state), a vastly simpler programming experience, peace of mind and who knows, maybe even the compiler writers an easier time.