My advice would be to do just that. We could change the internal storage to be a set of TypeExpander objects instead of callbacks. The existing lambda methods can just construct a simple TypeExpander internally. That way users that want the more general functionality can get it, and no existing users have to be change. This is the direction that I intended to move towards when I made the lambda callbacks in the first place. The only thing I would be against is using inheritance for extension, ideally all of the virtual methods on TypeConverter go away and users just provide these “extension”(TypeExpander) objects to control behavior.
An easy first step to break the direct connection with dialect conversion would be to move TypeConverter to a new header file TypeConversion. At that point we can establish that dialect conversion is one (well main) user, but not the only one.