Maybe it has something to do with how long the game is running?
If I could find a machine on which it crashes... and then test the project on there... that might find it.
Also, yes, foreach loops can sometimes become infinite. I always add and remove via secondary "safe" lists that only get processed outside of the main iteration loop. C# should generally throw an error if the list is being removed from during your foreach, but there aren't any safeguards in place to check for runaway additions. Not saying it's definitely a problem, but it might be. Good luck!
foreach (var item in collection.ToArray())
There might be something to the dual monitor setup causing crashes
for (int i = collection.Count - 1; i > -1; i--)
30 minutes and 2 straight playthroughs later, no freezes Yay!