How about using font fallback mechanism inside GDI? That is creating a logical font (`LOGFONT`) with a certain `lfPitchAndFamily` value (e.g. `FF_ROMAN`). Then, you can make `GdipFamily` from `LOGFONT` via `GdipCreateFromLogfont` and `GdipGetFamily`.
Win32u.dll has some fallback lists including Liberation fonts. See around https://gitlab.winehq.org/wine/wine/-/blob/wine-8.8/dlls/win32u/font.c#L997 for the implementation.