This is a simple routine that creates a new widget zone at a specified location in the base cshtml code and then removes it on uninstall.

public override void Install()
        {
            insertWidgetZone();
            base.Install();
        }
        public override void Uninstall()
        {
            removeWidgetZone();
            base.Uninstall();
        }
        private void insertWidgetZone()
        {
            string strPath= HttpContext.Current.Server.MapPath("~/Administration/Views/Product/_CreateOrUpdate.Pictures.cshtml");
            string strFileContents = File.ReadAllText(strPath);
            int strPoint1 = strFileContents.IndexOf(@"<strong>@T(""Admin.Catalog.Products.Pictures.AddNew"")</strong>");
            int strPoint2 = strFileContents.IndexOf("</script>", strPoint1);
            string strResults = "";
            strResults = strFileContents.Insert(strPoint2 + 9, Environment.NewLine + @"@Html.Widget(""NewImages"")");
            File.WriteAllText(strPath, strResults);
        }
        private void removeWidgetZone()
        {
            string strPath = HttpContext.Current.Server.MapPath("~/Administration/Views/Product/_CreateOrUpdate.Pictures.cshtml");
            string strSearch = @"@Html.Widget(""NewImages"")";
            StringBuilder sb = new StringBuilder("");
            string[] lines = File.ReadAllLines(strPath);
            foreach (string line in lines)
            {
                if (line.Trim() != strSearch)
                {
                    sb.Append(line + Environment.NewLine);
                }
            }
            File.WriteAllText(strPath, sb.ToString());
        }

yes you must open the file you want to add the new widget zone to and locate the exact point of insertion, but done once and you can forget trouble with your plugin because of lost widget zones.The code listed above adds a new widget zone to the file _CreateOrUpdate.Pictures.cshtml which is the images tab of the product info page in the admin section.