Can I, without locking, safely call List.AddRange(r) from multiple threads? If not, what sort of trouble would I run into?
Until .NET Framework 4.0, no .NET collections are thread-safe. You will then be required to lock it before you access it in your code Collections and Synchronization (Thread Safety).
On the other hand, .NET Framework 4.0 introduces the new System.Collections.Concurrent namespace which includes fine-grained Thread-Safe Collections.
Finally, if you can use .NET Framework 4.0, I strongly recommend you do so for what you need, otherwise, make sure to lock the collection each time you want to modify or access it.
Besides, a static collection should be thread-safe, but beware, as the members are not guaranteed to be.
EDIT #1
After further verifications due to Steve Townsend's comment, I admit that there are three thread-safe collections within the .NET Framework starting with version 3.0:
I apologize, I just learned their exitense myself. =)