A, Buzz, C, D, E, Fizz, G
Python 3, 180 174 168 160 152 bytes
from sys import*
J=''.join
L=str.lower
s,a,b=J(stdin).split(', ')
print(J('FBFBiuIUzzZZzzZZ'[L(k)==L(b)::2][k!=L(k)::2]*(L(k)in L(a+b))or k for k in s))
This is just a more golfed version of Stephen's answer, in Python 3. This chips away 42% of his bytes. Python 2 would save one byte on the print, but such is the price of progress. This handles newlines properly.
Thanks to Blckknight for saving 8 bytes on input.
Python, 109 bytes
lambda s,w:"".join([c,"Fizz","Buzz","BUZZ","FIZZ"][-~w.lower().find(c.lower())*-~(-2*c.isupper())]for c in s)
Try it online!
Takes the two characters as a single string
Edit: Added testcase to TIO link, newline works too
Jelly, 34 bytes
Œl=€⁹Œl¤ȧ€"“¡Ṭ4“Ụp»o"/ȯ"Œu⁹Œln$T¤¦
Try it online!
How?
Œl=€⁹Œl¤ȧ€"“¡Ṭ4“Ụp»o"/ȯ"Œu⁹Œln$T¤¦ - Main link: characters, string
Œl - lowercase the characters
¤ - nilad followed by link(s) as a nilad:
⁹ - right argument, the string
Œl - lowercase
=€ - equals (vectorises) for €ach (a list of 2 lists that identify the indexes of the string matching the characters regardless of case)
“¡Ṭ4“Ụp» - dictionary strings ["Fizz", "Buzz"]
" - zip with
ȧ€ - logical and (non-vectorising) for €ach (replace the 1s with the words)
/ - reduce with:
" - zip with:
o - logical or (vectorises) (make one list of zeros and the words)
- implicit right argument, string
" - zip with:
ȯ - logical or (non-vectorising) (replace the zeros with the original characters from the string)
¦ - apply...
Œu - uppercase
- ...to the indexes (the words at indexes):
¤ - nilad followed by link(s) as a nilad:
⁹ - right argument, the string
$ - last two links as a monad (i.e. the string on both sides):
Œl - lowercase
n - not equals (vectorises)
T - truthy indexes (the indexes of the capital letters in the string)