There is now a third sub-menu on the right-click menu, beneath "Skins" and "Banks", from which you can select the among the programs in the current bank.
I missed one item for the Xcode export. Life is also easier if you put the VST3 SDK where Steinberg expects them, which is ~/SDKs/VST3_SDK on Mac or Linux, or C:\SDKs\VST3_SDK on Windows.
This code includes the changes needed for compatibility with older patch/bank files, which assume a maximum count of 8. New patches/banks will be saved with an extra XML attribute (voiceCount="32"); if this is not present, then a value of "1.0" for the voice count will be interpreted as 8.
JUCE 5.4.4 breaks a lot of code, because several APIs that used to use plain pointer types have been converted to std::unique_ptr. Fortunately, this only affects the OB-Xd code in two spots. I've done a bit of fancy footwork with #define/#if to allow the code to compile cleanly with either version, but this kind of thing shouldn't be carried on forever. I'd strongly recommend switching to JUCE 5.4.4 as soon as it's practical, and then getting rid of all this #if business.
These changes allow use of the default JUCE paths on all platforms. Life is much simpler if you put JUCE where it "wants" to be: ~/JUCE on Mac/Linux or C:\JUCE on Windows.
I also cleaned up some settings for the VS2019 builds. x64/x32 were reversed, etc. This is all tested in both VS2019 and VS2017.
To ensure backward-compatibility with older banks, the program format has been updated to include a new "voiceCount" attribute (with value 32). When loading patches, the patch XML is checked, and if it does not include the "voiceCount" attribute, the value of the VOICE_COUNT parameter is scaled by 0.25, i.e., to the range 0-8, instead of the new range 0-32. Newly-saved patches will have the new attribute, and the parameter value will not be scaled when the patch is read in.