Get texture from fragment/vertex passes?

I’m trying to get the effect of optic glass (old car headlights, etc) for my own uses. I had thought about using GrabPass to achieve it, and lo and behold Unity already had just what I wanted: Bumped Distortion. Perfect. Except it’s only part of what I want. It has the optic effect, but now I need to write the Surface aspect of it, namely tinting, decals, and emission. I understand how to do all these on surface shaders, but that doesn’t help with optics. So my question is:

How do I use a previous fragment/vertex pass’s computed image as a texture for a Surface shader?

For reference, here’s the full Bumped Distortion shader:
Bumped Distortion Code

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "FX/Glass/Stained BumpDistort" {
Properties {
     _BumpAmt  ("Distortion", range (0,128)) = 10
     _MainTex ("Tint Color (RGB)", 2D) = "white" {}
     _BumpMap ("Normalmap", 2D) = "bump" {}
}
Category {
     // We must be transparent, so other objects are drawn before this one.
     Tags { "Queue"="Transparent" "RenderType"="Opaque" }
     SubShader {
         // This pass grabs the screen behind the object into a texture.
         // We can access the result in the next pass as _GrabTexture
         GrabPass {
             Name "BASE"
             Tags { "LightMode" = "Always" }
         }
      
         // Main pass: Take the texture grabbed above and use the bumpmap to perturb it
         // on to the screen
         Pass {
             Name "BASE"
             Tags { "LightMode" = "Always" }
          
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata_t {
     float4 vertex : POSITION;
     float2 texcoord: TEXCOORD0;
};
struct v2f {
     float4 vertex : SV_POSITION;
     float4 uvgrab : TEXCOORD0;
     float2 uvbump : TEXCOORD1;
     float2 uvmain : TEXCOORD2;
     UNITY_FOG_COORDS(3)
};
float _BumpAmt;
float4 _BumpMap_ST;
float4 _MainTex_ST;
v2f vert (appdata_t v)
{
     v2f o;
     o.vertex = UnityObjectToClipPos(v.vertex);
     #if UNITY_UV_STARTS_AT_TOP
     float scale = -1.0;
     #else
     float scale = 1.0;
     #endif
     o.uvgrab.xy = (float2(o.vertex.x, o.vertex.y*scale) + o.vertex.w) * 0.5;
     o.uvgrab.zw = o.vertex.zw;
     o.uvbump = TRANSFORM_TEX( v.texcoord, _BumpMap );
     o.uvmain = TRANSFORM_TEX( v.texcoord, _MainTex );
     UNITY_TRANSFER_FOG(o,o.vertex);
     return o;
}
sampler2D _GrabTexture;
float4 _GrabTexture_TexelSize;
sampler2D _BumpMap;
sampler2D _MainTex;
half4 frag (v2f i) : SV_Target
{
     // calculate perturbed coordinates
     half2 bump = UnpackNormal(tex2D( _BumpMap, i.uvbump )).rg; // we could optimize this by just reading the x & y without reconstructing the Z
     float2 offset = bump * _BumpAmt * _GrabTexture_TexelSize.xy;
     i.uvgrab.xy = offset * i.uvgrab.z + i.uvgrab.xy;
  
     half4 col = tex2Dproj( _GrabTexture, UNITY_PROJ_COORD(i.uvgrab));
     half4 tint = tex2D(_MainTex, i.uvmain);
     col *= tint;
     UNITY_APPLY_FOG(i.fogCoord, col);
     return col;
}
ENDCG
         }
     }
     // ------------------------------------------------------------------
     // Fallback for older cards and Unity non-Pro
     SubShader {
         Blend DstColor Zero
         Pass {
             Name "BASE"
             SetTexture [_MainTex] {    combine texture }
         }
     }
}
}

In my own edit (not show here) I have added the surface aspect, but it just overwrites the previous passes. As far as I can tell, I want to access the final Col element of the final pass of the above code, and apply it as the initial Albedo for the surface shader.

Is this even possible?

PS. I’m mildly experienced in shaders, not a total noob but near that end of the spectrum, for reference.