This is the correct behaviour - you're calling renderWith() on your ProjectPage class, which is not attached to the controller by default, which means you can't access any of those methods.
Firstly - is there a reason you're using an action to render another page? It would be much simpler to directly link to the page. It seems that this is what you're currently trying to do, so I would reccomend just using the $Link method in your template and link directly to the page in order to avoid duplicate content + hack problems etc.
On the other hand, if the ProjectPage isn't a sub-class of SiteTree, it makes sense to render in an action. The best way to do this is to create a custom action template - you do this by making a template called (Class)_(action).ss - in this case PageProject_project.ss
You can then modify your project method to something like this:
public function project() {
return array (
'ProjectPage' => DataObject::get_by_id(...)
);
}
You can then use <% control ProjectPage %> in your template.
If you are really stuck with using an action to render a SiteTree object, you can do something like this to couple it to a controller: (I'm presuming your using 2.2.x)
public function project() {
$controller = new ProjectPage_Controller(DataObject::get_by_id('ProjectPage', ...));
$controller->init();
return $controller->getViewer('index')->process($controller);
}