Here's how perfect guarding works:
You press the shield button, and for 0.2 seconds any hits to the shield will be perfect guarded. It's basically the startup animation for your shield. Now let's add lag to this equation.
On a relatively high ping, say 100, your command to raise the shield will arrive to the server 0.1 seconds after you pressed the button. Thus, the perfect guard window is moved to 0.1-0.3 seconds after the button press.
Your high ping also means that all the enemies are 0.1 seconds away from where they are as well, meaning they will hit you 0.1 seconds earlier than they would playing locally (or 0 ping).
The problem with adjusting for all this, especially when talking about perfect guards, is that in general increasing the perfect guard window wouldn't even help all that much. As Ark said, if you get hit you pressed the button too late, and no code could ever be made to handle something that hasn't even happened yet (as far as the server is concerned).
Implementing a system where ping would give an easier time to perfect guard would both take a lot of work, be tricky to test and probably not improve the gameplay experience regardless. It could not avoid the client taking damage which is the biggest loss of missing a perfect guard (compared to just blocking normally).
A general tip if you know you're lagging is to exaggerate how early you press the shield button. 0.2 seconds is actually quite a long time, so instead of lifting your shield as late as possible try to catch the attack with the end of your startup animation. For up to about 100 ping, this should let you perfect guard correctly most of the time.