I've made stabs at this problem before with White Wolf character generation (
Characturge ).
It's obviously an old problem with software development, and you generally see several kinds of approaches to solving it.
A. The software is enormously complex and comes with its own script (or procedure if you prefer) language that exposes variables (or objects for later generations) to manipulation by "power users." Microsoft likes this approach a lot, which is why all of their networking products are virus havens.
Upsides: Very flexible, limited expertise required of casual users.
Downsides: Hideous amounts of development time required.
B. The software is really essentially a library - "users" build applications out of components. These are things like MFC, OWL, LabView. Nowadays they typically they come with some kind of GUI CASE tool, so that they approach the script language solution.
Upsides: Even more flexible
Downsides: Even casual users generally have to be fairly savvy. Development time ridiculous.
C. The software itself may be fairly inflexible, but it uses some interprocess communication scheme to allow it to act as a part of other software, via DDE, OLE, COM, AFX controls, etc. Computer scientists love this because it's complex and theoretically rich. Developers generally grumble about it because it's complex and theoretically rich. Another important working example of this in real life is SAP. SAP sucks. On the other hand, Office also uses this approach, and it actually does tend to work fairly smoothly.
Upsides: Not so hard to develop, once you get past the interprocess comm hump, though it can be a big hump.
Downsides: Requires developers to be familiar with arcane protocols, expressed in bizarre computer science jargon, that are highly platform dependent and become obsolete every year or two.
Of course, many real solutions use combinations of all three of these.
I have actually tried using OLE in my character generators, and back in the mid 90s I had a test version of VtMChar (my older Vampire character generator) that you could embed via OLE. Part of the reason for this was that many users wanted note taking capabilty in it, and it seemed like it would make sense to be able to either embed character sheets in word processor documents or embed word processor documents in the character generator. However, I heard nothing but chirping crickets when I floated the idea in public, so I never took it beyond the test stage.
My next approach was (A), which led to Characturge with its template files. My big motivation for this was that White Wolf kept revising Vampire and adding new games, and I didn't want to keep adding Options to VtMChar.
I learned several things from this. First, even in WW's much smaller RP community, plenty of people were ready and able to develop templates. Second, the more general character generator by nature had to be much clunkier than the highly specific VtMChar. Third, no matter what I added, White Wolf's developers would continue to add weird rules that woule require some new functionality. Eventually, with grad school taking ever more time, I stopped working on it. People still email me asking for the source code, and I might eventually give it out if I get around to it.
My first plan to push it forward if I ever got time was to write it in a more portable language than VC++. I thought Java was the answer. Then I actually saw Java applications in the field. After I had three JREs loaded on my system to run each different Java app, I decided it wasn't the answer after all, though I did end up using a Java component in my networked dice roller.
The next thing I tried was to build it using DHTML. This almost worked (very flexible, widely known API, those nasty rendering tasks were taken care of), but I could never get a reasonable data persistence mechanism worked out because browser developers were getting continually more paranoid about data persistence.
My current thought is that the best thing you could do is to build it around some open source browser code, say like Mozilla. Most browsers have enough objects and enough rendering power exposed as it is to do anything you could possibly want to do in character generation. With some alterations or additions to the serialization capabilities (say a sandbox for storing persistent character data, which is really no different than caching or cookies), you'd have something vastly ahead of any character generation software currently extant.