Wait a minute - I think we've all missed the point.
The collection classes are not thread-safe. If the collection is being accessed by multiple threads without thread-locking, then you need to fix that. It's a particularly insidious problem because it will work correctly [edit - or throw a predictable exception] 99.999% of the time, and 0.001% of the time it will do something totally unpredictable and nearly impossible to reproduce.
A simple approach is to use lock{} statements around EVERY place where ANY code accesses the collection. That may be slight overkill but it is the safest plan. For iteration you can either put a lock around the whole loop or if you don't want to block out other threads that long, just lock it long enough to make a snapshot:
object[] snap;
lock (list)
{
snap = list.ToArray();
}
foreach (object x in snap) ...