For 1. I did something like that for a music visualization project I did last year: VR music visualization
The grid moves up and down based on a noise function and towards the user with its speed based on the intensity of the music. The implementation uses a 2D array of floats in the [-1 1] range. To form the waves I computed a number of points between all the neighboring floats in the 2D array with sine wave interpolation to smooth out the shapes. To move points at the start back to the end, you can use a circular buffer. You’d store the index where the first row of points is at. We only scrolled in one dimension, which simplifies things. If you scroll on both axes you’ll need one index for each.
For 2. I’d go with a physics engine. BepuPhysics is great. The author is working on a complete rewrite, bepu v2, but I’m not sure that’s ready for production use.