Поскольку foreach использует перечислитель, и перечислители не могут изменять базовую коллекцию, но могут, однако, изменять любые объекты, на которые ссылается объект в коллекции. Именно здесь вступают в игру семантика типа Value и Reference.
В ссылочном типе, то есть в классе, вся коллекция хранит ссылку на объект. Как таковой, он на самом деле никогда не касается ни одного из членов объекта и не может заботиться о них. Изменение объекта не затронет коллекцию.
С другой стороны, типы значений хранят всю свою структуру в коллекции. Вы не можете прикоснуться к его членам, не изменив коллекцию и не сделав недействительным счетчик.
Кроме того, перечислитель возвращает копию значения в коллекции. В ref-типе это ничего не значит. Копия ссылки будет той же самой ссылкой, и вы можете изменить ссылочный объект любым способом, каким захотите, с изменениями, выходящими за пределы области видимости. С другой стороны, значение типа означает, что все, что вы получаете, - это копия объекта, и поэтому любые изменения в этой копии никогда не будут распространяться.