If what you want to do with GrabPass is capture the current frame and add something on top of it, then it’s still the same as in URP 12 / 14.
Check my reply in → How to blit in URP 12
The common mistake is that people forgot to “copy” the current frame to a temporary RT first, and try to Read & Write to a same RT(the current frame) at the same time.
You can also check the official FullScreenPassRendererFeature.cs that performs this operation and blits the result to the screen. (The link above goes directly to the line where the script performs the copy I mentioned. The script uses the m_FetchActiveColor flag to control whether to copy the current frame into a temporary RT or not.)
I found It’s even eaiser to setup these kind of pass with RenderGraph since there’s no need to manual handle RT.