Without coupling your code to any of the data values in your input file and instead just relying on your header values repeating:
$ cat tst.awk
BEGIN {
FS = "[[:space:]]*:[[:space:]]*"
OFS = "|"
}
seen[$1]++ { prt() }
{
hdrs[++numFlds] = $1
vals[numFlds] = $2
}
END { prt() }
function prt( fldNr) {
if ( !doneHdr++ ) {
for (fldNr=1; fldNr<=numFlds; fldNr++) {
printf "%s%s", hdrs[fldNr], (fldNr<numFlds ? OFS : ORS)
}
}
for (fldNr=1; fldNr<=numFlds; fldNr++) {
printf "%s%s", vals[fldNr], (fldNr<numFlds ? OFS : ORS)
}
numFlds = 0
delete seen
}
.
$ awk -f tst.awk file | column -s'|' -o' | ' -t
Roll number | Mobile Number | Grade
187437366 | 07995036927 | A
187437367 | 07995036937 | B