You can, but iirc there's so much bus infighting that you'd have an easier time working with the Saturn.
Actually, the Sega system has very little bus contention compared to other consoles of the time... when you understand how to avoid it.
With the Sega CD, keep the code/game data in the program ram, and avoid the word ram unless you're generating shared data for the MD side.
With the Genesis/MD, keep the code/game data in the work ram, and avoid the cart as much as possible. This limits the amount of code the MD side can use, but you're better off moving most of the code to the SCD 68000 (which is almost twice as fast), or to the 32X SH2s (which can be up to 40X faster). Code on the MD should really only be enough to respond to requests by the 32X or by the SCD.
With the 32X, using the cart for code/game data isn't going to be as bad as you'd think since the SH2 has a very good and decent size cache. However, put critical code/data into SDRAM for best effect. This is fairly easy to do in gcc, and is used quite a bit in D32XR to put functions into SDRAM.
When you work to minimize bus contention, you can get really good results from the 32X. Look at Doom 32X Resurrection: remember that it's running on two 23MHz processors on a slow 16-bit bus. Now think about how Doom ran on the 386SX, which is about as close as you'd get for a hardware comparison.