Я знаю, что этот вопрос очень старый, но я наткнулся на него после того, как столкнулся с этой проблемой ранее. Это связано с другими проблемами, такими как http://forums.silverlight.net/p/96989/279885.aspx
По сути, корень заключается в том, что элемент управления DataGrid хочет избежать дрожания строк. Из-за виртуализации, когда вы выключаете элемент (допустим горизонтальную прокрутку), элемент больше не отображается. Поэтому, когда Silverlight пытается определить высоту строки, если самый большой фрагмент строки находится за пределами (и, следовательно, виртуализирован), тогда он не может точно знать, какой длины должна быть строка, без рендеринга всего содержимого вне экрана. Таким образом, в этом случае они пошли на компромисс, они используют высоту элементов на экране или текущую высоту строки, если текущая высота больше, чем у всех элементов, находящихся в данный момент на экране. Это приводит к описанному вами поведению.
Существует несколько обходных путей, один из которых описан в приведенной выше ссылке: отключить виртуализацию в DataGrid, но это может повлиять на производительность, если в DataGrid имеется нетривиальный объем данных. Другой, который я использовал, состоял в том, чтобы установить высоту строки DataGrid равной 0, вызвать повторную визуализацию и затем установить для высоты строки значение по умолчанию или автоматически. Таким образом, я смог заставить ряды сжаться.
Надеюсь, это поможет тому, кто сталкивается с этой проблемой.