Using Graphics.DrawMeshInstancedIndirect so that I can calculate the fish positions with compute shader.
The moving tails are just vertex displacements in shader. Rotation are also done in the rendering shader.
Below is the look-at matrix that takes the normalized velocity to be the rotation, and to be the forward axis.
Next, I used the shader from here to make the fishes reacts to light. Put some post-processing effects and fog to make it looks a bit better. One point to note, the normal has to rotate the same way that the vertices do.