IIRC, there is a value in the boot area that tells the BIOS where the first program from CD (for the standard boot code, this seems to be the first file on the disc) should be loaded to. The default for SGL is 06004000. Anyway, if you don't want to mess with modifying the boot area, you could probably do a two-stage loader that looks like this:
Stage 1: Loads normally and runs from 06004000; loads stage 2 to 02000000 and runs it.
Stage 2 (for your example of a trainer): Does intro/menu/whatever, then loads the final program to its native address, applies patches, and runs.
There might be problems with using an SGL program as a loader/patcher, since some SGL calls might mess with some of the reserved SGL memory areas, but there's only one way to be sure... If you want to compile a C program for a different address, you might try something like (this is missing the stuff for the SGL libs):
gcc -o blah.coff blah.c -Ttext 0x02000000
objcopy blah.coff blah.bin -O binary
This is just a guess; I'm really no expert on GCC (or ld, which is what the -Ttext option actually gets passed to), and I don't have my Saturn set up to try it right now. Hopefully that will work though.