This is tricky because the username parameter could override your action methods that are in the same controller, and even implicit action methods in other controllers.
Example
Supposed you have an action method in your HomeController called "Profile"
All is fine until one of your users decided to use the word "profile" as their username. Suddenly the username profile could override the action method profile, now your users could no longer go to the profile page.
Route Configuration.
Here is the route configuration that you are looking for. Of course this doesn't solve the problem mentioned earlier. You just have to stop users from using usernames with special meanings.
// /{username} configuration
routes.MapRoute(
name: "UserIndexRoute",
url: "{username}",
defaults: new { controller = "Users", action = "Index", username= UrlParameter.Optional },
namespaces: new[] { "MyApp.Controllers" }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] { "MyApp.Controllers" }
);