The difference between backgrounding a program - or not - lies in waiting for it to finish, or don't wait. So you don't really have to use two different execvp's. But, you need to remove the trailing bg from the arguments. Appending the & won't do anything - the & is a metacharacter for the shell, which tells the shell not to wait for the program that's being executed.
So, what you should do is:
if the last argument is "bg" : decrease argc by one, set the argument that had the bg to null
fork and execvp what's in argv
if the last argument was "bg", do NOT call wait(); else call wait.