File::UserConfig might be one way to at least handle the initial case.
It installs to the module's "auto" share directory a default copy of the configuration file/directory.
When the program runs the first time for a new user, it copies it to the appropriate place.
For the upgrade case, perhaps what Ruby on Rails does for SQL schema. You have the config in a format you can manipulate, then write a series of classes that upgrade or downgrade from one version to the next.
Upgrading over a number of releases just means running each upgrade sequentially (with a backup first).