Похоже, что IValueFormatter принимает значение типа object и возвращает значение типа string, а ValueResolver<TSource, TDestination> принимает значение любого типа и возвращает значение любого типа. Таким образом, он более гибкий. Также существует вопрос, что с ValueResolver вам никогда не нужно указывать источник на определенный тип - вы определяете его явно в своем определении класса.
Учитывая это, зачем использовать IValueFormatter? Делает ли это что-то, что нельзя сделать с помощью ValueResolver? Я не понимаю, как это работает?