Almost four years later, I have finally learned enough to make this happen :
https://www.youtube.com/watch?v=ocvFcOWbroMMy initial hurdle was I did not understand how exactly Action 52 does its bankswitching. Once I understood that the address that is accessed is just as important as the data written to it, then I could understand what the breakpoint I set in Mesen's debugger was trying to tell me.
I tried extracting each individual game as its own ROM, but this did not work for all games because some 32KB banks had the code for two or three games. Each game had to have the whole 512KB of CHR-ROM tacked on, making for very large ROMs. Without the menu, only one game would work. So I found out where the menu was, the first 32KB bank of the second 512KB, carved out that 512KB and the games within the second 512KB appear to work as well as they ever did. Then I replaced the first 32KB of the third 512KB and with the menu code. That seems to work fine for those games in the third 512KB bank.
What is left is the Intro, the game I booted out of the third 512KB and the three games contained in the first 512KB. As you can see, I kind of left them to their own ROMs. In the first 512KB, Bounty Bob takes up the first seven 32KB banks, followed by a 32KB bank for the Intro ("Make your selection now"), then Cheetamen has the next seven 32KB banks, and Ninja Assault rounds out the last 32KB bank.
The Cheetamen ROM is essentially the first 512KB with a slight adjustment to the code to make it boot instead of Bounty Bob. I tried combining all the Billy Bob banks into one ROM but I could not get past Level 2, Level 3 being in the next 32KB bank. I might revisit this at some point, but Billy Bob is such an awful game, I don't feel like playtesting it.