You can accomplish this with virtual servers, but that will require two virtual servers for each of your NATs to cover traffic flowing in both directions. To do this in an iRule may be "easier" as you will only need one vip, 0.0.0.0/0, and two data groups. You could try something like this. Obviously you will need entries for both sides connections could originate from.
when CLIENT_ACCEPTED {
if source matches in the data group snat it to the value of that entry
if {[class match [IP::client_addr] patList_dg]}{
snat [class lookup [IP::client_addr] patList_dg]
}
if destination matches in the data group direct traffic to the value of the entry
if {[class match [IP::local_addr] natList_dg]}{
node [class mlookup [IP::local_addr] natList_dg]
}
}