You can just have a CI job generate a CI config file and have GitLab CI load that into a child pipeline. Look up dynamic pipelines.
Documentation: https://docs.gitlab.com/ee/ci/parent_child_pipelines.html
GitLab 13.10 also added support for parallel matrix job execution in child pipelines, speeding up the execution once more.
https://about.gitlab.com/releases/2021/03/22/gitlab-13-10-re...
There's more to dynamic pipeline creation, collecting blog post ideas in https://gitlab.com/gitlab-com/www-gitlab-com/-/issues/11122#... :)
If all the shared pipeline jobs show up in your consumer project pipeline, you can easily extend them or overwrite them entirely.
We're migrating our shared pipeline away from child pipelines. Maybe one day we'll do a write-up. :)