Honestly world generation can be quite confusing. There is a huge number of classes and methods with similar sounding names - dimensions, dimension manager, world providers, world generators (both vanilla and Forge), chunk providers, chunk generators, biome providers, biome decorators, map generators, etc. that have methods like generate(), populate(), decorate().
Furthermore, the vanilla implementations are inconsistent and convoluted (for example, the WorldProvider class has a WorldType as well as a BiomeProvider and ChunkProvider instances, but WorldType generates those instances -- whereas a cleaner implementation would simply reference those through the WorldType instance).
Because of this, it is possible to hook together the classes in all sorts of ways to accomplish the same things. At the end of the day, once you're in the world generation process it is simply about placing blocks (and entities) and as a programmer there are infinite possibilities on how to achieve that.
I did try to put together some information which may help you here: http://jabelarminecraft.blogspot.com/p/minecraft-forge-1721710-biome-quick-tips.html
One way to string things together is as follows: if you want a custom world you could register a custom DimensionType which you then associate with a dimension id that you register to the DimensionManager. and is associated with a WorldProvider which has a WorldType instance that gives your custom ChunkProvider and BiomeProvider. Within the ChunkProvider you basically fire all the other stuff which can include custom BiomeDecorator and IWorldGenerator classes.