"Everything should be made as simple as possible, but no simpler." I think your version would run into dead ends very soon. You need to keep track for all grid positions what are remaining possible blocks (this is 'superposition') and eliminate them as you place blocks ('collapsing'). You also need a good strategy in which order to place blocks, and also how to backtrack if you run out of options.
The Townscaper seems to be using non-rectangular grid, so it's maybe more like a 2D graph of distributed nodes, with perhaps Voronoi algorithm to assign 2D geometry to each node. You make it sound trivial, it's a lot of work to make it work (and probably quite a few discarded prototypes along the way).
The Townscaper seems to be using non-rectangular grid, so it's maybe more like a 2D graph of distributed nodes, with perhaps Voronoi algorithm to assign 2D geometry to each node. You make it sound trivial, it's a lot of work to make it work (and probably quite a few discarded prototypes along the way).