A (maybe too elaborate, 'classical') pure-procedural approach might be to split your texture-space into tiles, using a Wrap node:

Below: original UV on the left. Wrapped UV ('Cell UV') in the middle. If you subtract the 'Cell UV' from the original UV, you get an index-per-cell ('idx'). 'Idx' is the coordinate of the origin of each cell's 'Cell UV'.

Once you have a per-cell index, you can use it for per-cell effects. Here it's used to give a random tilt per cell...

.. by looking up a bit of per-cell noise, and adding a multiple of it to the original normal. Below, showing 0, and increasing values in the Scale node:

You can also use the index for a shift of the coordinates of, say, a Musgrave texture, to use in a Bump, to put a wobble into the normals, per cell:

This shows 0 to increasing values in the 'Distance' field of the Bump node

If you combine the effects, you get a tilt-and-wobble per pane of glass:

This .blend includes the cluster for putting the black frame around the panes.
