Building on Uno's answer, I would recommend the following refactor for the controller action:

    public ActionResult Category(int? id)
    {
        // No need to create a pid variable if it's only 
        // used once here. Inline the null conditional.
        var category = db.Categories.Find(id ?? 1);
        
        if (category == null) 
        {
            // Assuming you have a global error handler attribute registered,
            // the condition where a requested category is not found is in fact
            // an exceptional state and the HTTP 404 status code is semantically
            // more intuitive than returning a generic error view.
            throw new HttpException(404, "Category not found.");
        }

        // I too tend to avoid returning IEnumerables outside of the context
        // because sometimes the enumeration depends on something that falls 
        // out of scope (like the data context). But I would typically avoid
        // the conversion to a list until the last possible moment.
        // If you need to come back and do some logic with the model later,
        // you can add it before returning the view and work directly with
        // the enumerable which is probably preferable in most cases.
        var model = category.Products;
        return View(model.ToList());
    }

As for separating the category partial into a controller action:

Category list action:

	public ActionResult CategoryList() 
	{
		@using (var db = new WebShopEntities()) 
		{
			return PartialView("CategoryList", db.Categories.ToList());
		}
	}

Partial view to go with:

	@model List<Category>
	
	foreach (var category in Model)
	{
		<a href="@Url.Action("Category","Product", new {id = category.id})" class="list-group-item">@category.name</a>
	}