Ошибка foreach не будет выполнена, потому что вы меняете коллекцию, которая прерывает итератор.
Ошибка сбоя, потому что вы удаляете только каждый другой элемент; рассмотрим: i = 0, вы удалите нулевой элемент. Теперь элемент, который был элементом 1, является элементом 0 - поэтому, когда вы удаляете элемент 1 (итерация следующего цикла), вы подпрыгнули.
Короткая версия: используйте Clear()
:
contentsPanel.Controls.Clear();
Более длинная версия: итерация назад:
for(int i=contentsPanel.Controls.Count-1; i>=0;i--) {
contentsPanel.Controls.RemoveAt(i);
}
Первый (Clear) проще.