Your first guess is correct, the view is still centered around the 2nd player's relative position, but you can just explicitly change that (since you're not going to actually have a second player) to get the cut-in wherever you want.
The black outline is pretty simple, check if the distance is "close to the max value" (e.g. < 0.001 difference, change to a larger/smaller value to change thickness) and if so, set the gl_FragColor to black rather than any of the sampled colors.
Despite the simple idea it's a bit of a mess but I'm thinking two changes will be enough:
#1, the distance check
if(dist < vsize[c]){ bestdist = dist; bestid = c; if(dist > vsize[c] - 0.0001){ //This part is new bestid = 9; } }
#2, at the end
if(bestid < 9){ gl_FragColor = sampcol[bestid]; } else{ gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0); }
Making it circular gets more complicated but I think you can "cheat" a bit to simplify this - instead of taking the distance between the actual pixels when doing the distance check, make two new vec2 variables which are copies of the player position / current fragment position but you multiply the x coordinate by 9.0/16.0 (the inverse of the aspect ratio).
So something like this might be enough, just replacing the dist check:
dist = distance(screenpos[c].xy*vec2(9.0/16.0, 1.0),v_vTexcoord*vec2(9.0/16.0, 1.0));