Using Aravind's method I've managed to improve the build pipeline:
# Our job invokes a wrapper batch file that splits the list of inputs and extracts the correct parameters (eg: CONFIGURATION_LIST="x64 x64 ARM ARM", PLATFORM_LIST="Debug Release Debug Release", run_instances=4). It then invokes the actual build script
# Upload any build artifacts from all runInstances to the runInstance-1 job using the RESTful API. This means that the output artifacts we expect from each stage are defined within the code we're building - this is probably a positive change
# Downstream jobs can fetch artifacts from the runInstances-1 job using whatever filter is convenient
PROS:
* Expected artifacts are checked into our repository as part of the build script. Even if this changes over time we can still build earlier versions
* Duplication of configuration and build logic is minimized
* Adding or removing configurations is straightforward and only requires changes to the single build job
CONS:
* Artifacts must be uploaded as individual files - there doesn't seem to be a way to upload an entire folder at once
* Changes to the configuration matrix break the ability to build older code revisions
While I was eventually able to get the repo-config working I found the process of making changes to be too error prone to make sense. There's no mechanism to validate the configuration files or preview what jobs will be created with a given input, and no visual editor. It's unfortunate, because being able to check in the job configuration itself would take care of the second point which I expect will be the biggest source of problems down the road.
Thanks again for the suggestion!