After a long process I solved this problem.
First I read here that the version of LuaBind I am running (0.9) should support automatic down/up casting of types when passed into parameters. This showed that it was possible.
I then found out here that there is a special header to include for converting shared pointers (which I realised I was using). The converter that comes with LuaBind only works with boost shared pointers. It was pretty simple to get the source for the boost smart pointer converter and replace every instance of boost:: with std:: and make a few small modifications so it would compile.
I then started getting errors that said
std::runtime_error: 'Trying to use unregistered class'
when I was calling bind methods.
There was a version of a shared pointer converter here but it didn't compile on my machine. I used it as a reference to make another header file which allows LuaBind to bind shared pointers from the standard library.
To make a long story short, include the following two files and automatic up/down casting of shared pointers work when you use the standard library version rather than the boost version.
I am using Xcode 5 with a clang compiler and I haven't tested it with another compiler.