For the basic wave shape I used something called Gerstner Waves. Gerstner Waves by themselves create a pleasent looking wave but a little too clean for my taste. So for something more realistic I added a few layers of random noise.
In order to assign colors to the vertices of the wave, I multiply a component of the angle from each surface normal by the corresponding vertex height. This gives me a decimal value that I can evaluate along a gradient to pick the right intensity of color. Once this process is done on all verticies, the wave is smoothly colored and in my opinion looks quite nice.
This Video and this Article were a huge help in making this!