If all we need is an outline around a rectangle, we can compute this analytically with the math of signed distance fields. :)
v2f vert (appdata v)
{
v2f o;
// Slightly enlarge our quad, so we have a margin around it to draw the outline.
float expand = 1.1f;
v.vertex.xyz *= expand;
o.vertex = UnityObjectToClipPos(v.vertex);
// If we want to get fancy, we could compute the expansion
// dynamically based on line thickness & view angle, but I'm lazy)
// Expand the texture coordinate space by the same margin, symmetrically.
o.uv = (v.uv - 0.5f) * expand + 0.5f;
return o;
}
fixed4 frag (v2f i) : SV_Target
{
// Texcoord distance from the center of the quad.
float2 fromCenter = abs(i.uv - 0.5f);
// Signed distance from the horizontal & vertical edges.
float2 fromEdge = fromCenter - 0.5f;
// Use screenspace derivatives to convert to pixel distances.
fromEdge.x /= length(float2(ddx(i.uv.x), ddy(i.uv.x)));
fromEdge.y /= length(float2(ddx(i.uv.y), ddy(i.uv.y)));
// Compute a nicely rounded distance from the edge.
float distance = abs(min(max(fromEdge.x,fromEdge.y), 0.0f) + length(max(fromEdge, 0.0f)));
// Sample our texture for the interior.
fixed4 col = tex2D(_MainTex, i.uv);
// Clip out the part of the texture outside our original 0...1 UV space.
col.a *= step(max(fromCenter.x, fromCenter.y), 0.5f);
// Blend in our outline within a controllable thickness of the edge.
col = lerp(col, _Color, saturate(_Thickness - distance));
return col;
}

This gives us an outline of constant pixel thickness with nicely rounded corners and antialiased edges (the green box above - the orange is Unity's selection outline, showing how we've expanded the quad relative to its otherwise identical twin below)