Since the potential for modifying the Custom Game screen is very limited, I've written a mod component that overlays the Custom Game screen with this (so far) mostly blank replacement:
The code, along with a compiled DLL, is available on GitHub. A playable version can be extracted from the ZIP download on GitHub. I'm posting this mainly to make other modders aware that the Custom Game screen could – probably – be replaced pretty cleanly. (Also: to get confirmation that my implementation actually works, and not just on my own system.) Of course someone – probably not me – would have to put in the effort of recreating all the menus. Or, better: implement a more user-friendly redesign. A hybrid approach could also work: place only a small overlay (for some special setting that a mod wishes to make) in an unused area of the original screen.
Implementation: The mod keeps track of certain calls to CvInitCore to detect when the Custom Game screen has been opened; then it opens the replacement screen on top of the original screen through a DLL-to-Python call (inspired by the Full Of Resources map script). When "Launch" is clicked, the replacement screen is closed and a press of the Return key is emulated (through the SendInput Windows function), which causes the "Launch" button of the original screen to be pressed. The default selection for the game speed menu is read from CvInitCore (which gets it from CivilizationIV.ini), and when the selection is changed, the new speed setting is stored at CvInitCore. The data at CvInitCore doesn't seem to get overwritten upon launch, so this is all it takes to bypass the original screen.
It looks a little strange when the two screens open (and close) in quick succession. This can't be helped. And there's a bit of an open issue with the "Go Back" button. Currently, the click on that button is doubled through SendInput so that the original "Go Back" button positioned in exactly the same place also gets clicked. This doesn't work if the user moves the mouse away very quickly or when "Go Back" gets pressed through TAB (highlight next button) and Return. I've tried emulating TAB followed by Return, but that wasn't working reliably at all. Crucially, the "Launch" button does work reliably on my end. (Well, unless the player has TAB'ed through all elements of the replacement screen, causing some element - other than "Launch" - to be highlighted on the original screen).
The code, along with a compiled DLL, is available on GitHub. A playable version can be extracted from the ZIP download on GitHub. I'm posting this mainly to make other modders aware that the Custom Game screen could – probably – be replaced pretty cleanly. (Also: to get confirmation that my implementation actually works, and not just on my own system.) Of course someone – probably not me – would have to put in the effort of recreating all the menus. Or, better: implement a more user-friendly redesign. A hybrid approach could also work: place only a small overlay (for some special setting that a mod wishes to make) in an unused area of the original screen.
Implementation: The mod keeps track of certain calls to CvInitCore to detect when the Custom Game screen has been opened; then it opens the replacement screen on top of the original screen through a DLL-to-Python call (inspired by the Full Of Resources map script). When "Launch" is clicked, the replacement screen is closed and a press of the Return key is emulated (through the SendInput Windows function), which causes the "Launch" button of the original screen to be pressed. The default selection for the game speed menu is read from CvInitCore (which gets it from CivilizationIV.ini), and when the selection is changed, the new speed setting is stored at CvInitCore. The data at CvInitCore doesn't seem to get overwritten upon launch, so this is all it takes to bypass the original screen.
It looks a little strange when the two screens open (and close) in quick succession. This can't be helped. And there's a bit of an open issue with the "Go Back" button. Currently, the click on that button is doubled through SendInput so that the original "Go Back" button positioned in exactly the same place also gets clicked. This doesn't work if the user moves the mouse away very quickly or when "Go Back" gets pressed through TAB (highlight next button) and Return. I've tried emulating TAB followed by Return, but that wasn't working reliably at all. Crucially, the "Launch" button does work reliably on my end. (Well, unless the player has TAB'ed through all elements of the replacement screen, causing some element - other than "Launch" - to be highlighted on the original screen).