В чем именно проблема, просто прочитал пару раз вопрос так и не понял в чем затык?
Что мешает при обходе создавать новый список с элементами которые не должны быть удалены и в конце просто заменять ссылку старого на новый.
Или работать с копией списка в цикле и удалять через .Remove(T) в исходном списке ?
Или формировать новый список из удаленных элементов, а потом делать через Linq Except ?
И кстати удалять из цикла foreach нельзя, для того чтобы модифицировать массив данных с которым работаете в цикле необходимо работать с его итератором, через другие циклы, например while.
Это лишь некоторые из вариантов первыми пришедшие в голову, думаю можно еще с десяток придумать.