My temporary conclusion is that the MVC pattern and defining constraints in a text-based programming language (as opposed to the visual drag-n-drop languages commonly used in software generation systems) is the best abstraction we can come up with without making the framework so rigid it suffers from leaky abstractions and hence comes apart rapidly.
It might seem like mostly clerical work and it isn't exactly accessible to non-programmers but the tools and frameworks commonly used for creating CRUD apps already abstract away a lot of the plumbing code that used to be necessary to do this.
Although on the surface most CRUD apps at least conceptually look exactly the same the devil often is in the details: Legacy databases, weird interfaces and data formats, data has to be imported from Excel, you name it.
Regenerating / modifying an app upon model changes can become particularly arduous depending on how frequently those changes occur.
If your data model conforms to some constraints though creating a run-of-the-mill CRUD app with tools like Spring Boot, Swagger and a generic, declarative UI is both fairly easy and robust.
As soon as the UI has to accommodate more specific use cases or you want to provide a more focused, less one-size-fits-all UX a mostly automatically generated UI however will fall apart rather quickly again.
By the way, at its core Uber is a CRUD app, too, isn't? Perhaps we don't need a generalised CRUD app generator but rather very specific app generators like this one.