A pre-processor is a great idea. Template Haskell and Cabal make it
possible to extend the language by adding all kinds of funky
pre-processing (via Cabal hooks) and compile-time calculations. It
wouldn't be too difficult to add a package-specific .ehs file type with
the desired behavior.
I'm currently using this combo to work around the TH limitation of not
being able to generate import statements. A Cabal hook looks in a
directory to find what .hs files are present, spits out an intermediate
file that imports all of these files, and Cabal compiles the generated
file into the final program.
I think that the biggest limitation of this setup is managing the files
if multiple stages of pre-processing are performed.