Я никогда не находил лучшего способа сделать это, чем итеративное использование MeasureString.
Вы можете оптимизировать, прыгая с шагом.
В WPF есть несколько более приятных опций для изменения размера текста, хотя это похоже на растирание соли в ране.