There are several ways to phase shift a square wave. A pulse train as well. If only edges are important, there are even more ways. Of these, the transient responses and ability to scale can be affected.
My two suggestions would be:
1.) input waveform into an integrator (with some supporting circuity for biasing) to generate a triangular waveform. The rate of change of voltage is constant and determined by the level of the input square wave*. The amplitude of the waveform scales with frequency (inversely). The delay required for a 90deg phase shift then becomes a A/2. A comparator is used to restore the waveform.
2.) A PLL with XOR phase detector can also provide a 90deg phase shift with a square wave input*.
3.) basically, the same idea as #1, but with a fixed delay. obviously this only gives a 90deg phase shift at one frequency. idea #1 attempts to adjust delay based on an estimate of frequency, thus creating the phase shift.
*modifications need to be made for non-square pulse trains. The above methods ignore some of the biasing issues (and control), which will tend to result in a slightly greater/less than a 90deg phase shift, especially vs input frequency.