Well, not sure if this is the most elegant solution:
awk '
{TMP = $NF
for (i=NF; i>1; i--) {sub ("," $i, _)
TMP = (i==2?"(":_) $0 (i==2?")":_) " " $(i-1) " | " TMP
}
gsub (/([^ ],[^ ]*)+/, "(&)", TMP)
print "| " TMP
}
' FS=, file
| (A) A | (A,B) B | (A,B,C) C | (A,B,C,D) D | (A,B,C,D,E) E | G
EDIT: or, a bit more straightforward,
awk -F, '{for (i=1; i<NF; i++) {TMP = TMP DL $i; DL = FS; printf "| (%s) %s ", TMP , $i}; print "| " $NF}' file
| (A) A | (A,B) B | (A,B,C) C | (A,B,C,D) D | (A,B,C,D,E) E | G
EDIT: revisiting the first proposal, it can be simplified somewhat:
awk '
{TMP = $NF
for (i=NF; i>1; i--) {sub ("," $i, _)
TMP = "(" $0 ") " $(i-1) " | " TMP
}
print "| " TMP
}
' FS=, file