You're going to want to look at the WorldChunkManager for the overworld (WorldChunkManagerGenerate or something like that) and ChunkProviderGenerate to see how the normal game does this.
The GenLayer files will be important for this. You may end up having to do a full re-implementation of GenLayer and its subclasses like I did at first to get things working.
GenLayer is important because its subclasses do things like setting biomeIDs for coordinates and changing biomeIDs are locations into other biomes (i.e. desert to desertHills). GenLayer also does some terrain manipulation that creates things like rivers and mushroom islands.
I'll warn you now that custom biomes can be a PITA. Make sure your reference to the WorldChunkManager and ChunkProvider for your dimension are always the correct ones during world generation, otherwise you could end up with frustrating NullPointerExceptions. Also, make sure that whatever array of Biomes/biomeIDs you end up using (you'll understand where this applies later) is never given a null value or an invalid biomeID (say, for a biome that doesn't exist).
I've gone through a lot of pain getting my dimension project to work, but currently it generates properly with caves, ravines, biomes, etc. It's all possible, just not for the faint of heart.