Passing data back to form on invalid submission
You can call setRouteVariables and not return anything from your controller so the request continues as normal.  Craft does this all the time with it's own controllers.  See this answer for the general controller workflow.