1) localhost/ProductList/Product/1
routes.MapRoute(
            "Product",                                         
            "ProductList/Product/{productId}",                           
            new { controller = "ProductList", action = "Product"}
        );
В контроллере "ProductList" создаете метод "Product", который принимает параметр "productId". В него MVC замапит переданный id продукта из урл localhost/ProductList/Product/{productId}.
localhost/ProductList/notebook
routes.MapRoute(
            "ProductList",                                         
            "ProductList/{categoryName}",                           
            new { controller = "ProductList", action = "Category",}  
        );
В контроллере "ProductList" создаете метод "Category", который принимает параметр "categoryName". В него MVC замапит переданный  название категории из урл localhost/ProductList/{categoryName}.
2)Есть ли возможность привести URL на странице продукта к виду localhost/ProductList/notebook/1, а затем к localhost/ProductList/notebook/[ЧПУ_ноутбука] (ЧПУ находится в БД и находится по id)?
localhost/ProductList/notebook/1
routes.MapRoute(
            "ProductFromId",                                         
            "ProductList/Product/{categoryName}/{productId}",                           
            new { controller = "ProductList", action = "Product"},
            new {productId = @"\d+" }
        );
Тут "new {productId = @"\d+" }" выступает в роли ограничения, что id может быть только числом.
localhost/ProductList/notebook/[ЧПУ_ноутбука]
routes.MapRoute(
            "ProductFromName",                                         
            "ProductList/Product/{categoryName}/{productName}",                           
            new { controller = "ProductList", action = "ProductFromName"}
        );
Можно совместить роуты, и определять на стороне контроллера что пришло, название продукта или id.
PS. Роуты нужно определять начиная с самого строгого. Иначе запросы будут мапится не на те роуты.