Я конечно не эксперт, но может быть проблему решит вызов Templist.toArray() в foreach? Тем самым будет сделана копия этого списка перед началом перебора и тогда всё будет хорошо... Возможно, конечно, я и не прав, или моё предложение не самое лучшее.)
Получится так:
foreach (var item in TempList.ToArray())