Интересно, что и при работе с массивом для значимого типа тоже все работает:
http://ideone.com/xsBBBnМне давно было интересно подобное поведение. Возможно, причина такого различия между коллекциями и массивами в следующем:
При работе с любыми коллекциями, когда происходит обращение к оператору [], в действительности происходит вызов методов get_Item(int index)/set_Item(int index, T value). Когда вызывается get_Item(int index) для коллекции, содержащей тип-значение, происходит его
копирование в качестве возвращаемого методом результата. Следовательно, любой код, типа:
менял бы просто копию.
Ссылочные типы просто вернули бы ссылку и все выполнилось нормально.
У массивов же при обращении к оператору [] используются более быстрые команды IL-языка (ldelema и пр.), которые позволяют вернуть непосредственно структуру (без копирования), хранящуюся в массиве.
Убедиться в этих предположениях также можно воспользовавшись дизассемблером IL-кода ILDasm.