Mail rules operate on in-bound emails, not on read emails. You would need to write an AppleScript that post-processes your read email, checks the read status of each email, and then sets the read message background color to gray.
In the Mail AppleScript dictionary, there is a message read status property with a boolean value so for a given message, you can get true or false on its read status and there is another property named background color where gray is among the named color options.
This will change the background of the message in the list of messages, but not the background of the message body.
Copy the following AppleScript into Apple's Script Editor (e.g. Dock : Launchpad : Other : Script Editor), click the hammer icon to compile it. Select an email message that you have read, and then click run in the Script Editor.
(*
gray_msg.applescript
set the message (not the message body) background to gray after you
have read the message. This code currently only operates on one
selected read message.
*)
use scripting additions
tell application "Mail"
if it is not running then activate
if not (get selection) is {} then
set theMsg to item 1 of (get selection)
else
return
end if
tell theMsg
if its read status then
set its background color to gray
end if
end tell
end tell
return
Select any email message where you have read it, and want its background set to gray.